const path = require('path');
const envFile = process.env.NODE_ENV === 'production' ? '.env.production' : '.env.development';
require('dotenv').config({ path: path.resolve(__dirname, envFile) });

//express 模块
const express = require("express");
const app = express();
//其他模块

const helmet = require("helmet");
const compression = require("compression");
const rateLimit = require("express-rate-limit");
const router = require("./routers/index");
const config = require("./config/defaults");
const jwt = require("./lib/jwt");
const cors = require("cors");

// 使用 express 的 static 中间件，将 __dirname 目录下的 data 文件夹设置为静态资源目录，
// 这样客户端就可以直接访问该文件夹下的静态文件，如图片、CSS、JavaScript 文件等。
app.use(express.static(__dirname + "/data"));

// 引入跨域依赖 cors
const corsOptions = {
  origin: [
    // 1. 线上主域名（必须 HTTPS）
    "https://ccchublog.cn",
    "https://www.ccchublog.cn",
    "https://admin.ccchublog.cn",
    "https://api.ccchublog.cn",   // 如果后端自己调自己也要放行
    // 本地开发的端口
    "http://localhost:8080",
    "http://127.0.0.1:8080",
    "http://localhost:5273",
    "http://127.0.0.1:5273",
  ],
  credentials: true,
  optionsSuccessStatus: 200,
};
app.use(cors(corsOptions));

// 安全中间件
app.use(helmet());
app.use(compression());

// 速率限制
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分钟
  max: 100, // 限制每个IP 100次请求
  message: "请求过于频繁，请稍后再试",
});

// 解析 JSON 格式的请求体
app.use(express.json());

// token处理
app.use(async (req, res, next) => {
  let token = req.body?.token;
  if (typeof token == "undefined") {
    // 如果请求体中没有 token 字段，则直接调用 next() 函数，跳过中间件
    next();
  } else {
    // 如果请求体中有 token 字段，则调用 jwt.verifyToken() 函数验证 token 的有效性
    let isok = await jwt.verifyToken(token);
    if (isok == 1) {
      // 如果 token 有效，则调用 next() 函数，继续处理请求
      next();
    } else {
      // 如果 token 无效，则返回错误信息
      res.send({ code: 401, msg: "token验证失败" });
    }
  }
});

//引入路由
app.use("/", router);
app.use("/api/", limiter);

app.listen(config.port, () => {
  console.log(`blog应用正在监听端口 ${config.port}`);
});
